package com.mamesoft.namibiamc.beans;

import com.mamesoft.namibiamc.tools.JDBC;
import com.mamesoft.namibiamc.tools.Utility;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.ResultSet;
import hirondelle.date4j.DateTime;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;

public class VisiteBean {

    private int idVisita;
    private int idMedico;
    private int idPaziente;
    private int idToVisit;
    private String nomePaziente;
    private String cognomePaziente;
    private String tipoVisita;
    private VisiteBean vB;
    private Date dataVisita;
    private boolean render = true;
    ArrayList<VisiteBean> l = null;
    private int richiami;
    //visita parametri
    private boolean renderPazienteError = false;
    private boolean renderTipologiaError = false;
    private boolean renderDescrizioneError_lunga = false;
    private boolean renderDescrizioneError_corta = false;
    private boolean renderCalendarError = false;
    private boolean renderSuccess = false;
    private boolean renderUnsuccess = false;
    private String descrizione = "";
    private String tipologia = "";
    private Date data;
    private ArrayList<String> richiamo;
    private ArrayList<Integer> ritardoRichiamo;

    /** Creates a new instance of VisiteBean */
    public VisiteBean() {
    }

    public List<VisiteBean> listaRichiami() {
        try {
            l = new ArrayList<VisiteBean>();
            Connection c = JDBC.connect();
            String q = "SELECT pID,cartella.ID,nome,cognome, data, tipo_visita,richiami "
                    + "FROM  `cartella` JOIN anagrafe ON ( cartella.pid = anagrafe.id ) "
                    + "WHERE is_fatta LIKE  'F' "
                    + "AND richiami >0 "
                    + "AND mID = " + idMedico + " "
                    + "ORDER by data ASC;";
            ResultSet set = JDBC.executeQuery(q, c);
            while (set.next()) {
                VisiteBean vb = new VisiteBean();
                vb.setIdVisita(set.getInt("ID"));
                vb.setIdPaziente(set.getInt("pID"));
                vb.setDataVisita(set.getTimestamp("data"));
                vb.setTipoVisita(set.getString("tipo_visita"));
                vb.setNomePaziente(set.getString("nome"));
                vb.setCognomePaziente(set.getString("cognome"));
                vb.setRichiami(set.getInt("richiami"));

                l.add(vb);
            }
            set.close();
            c.close();
            if (l.isEmpty()) {
                return null;
            } else {
                return l;
            }

        } catch (Exception ex) {
            return null;
        }
    }

    public void preparaVisita(int idToVisit) {
        try {
            this.idToVisit = idToVisit;
            Connection c = JDBC.connect();
            String q = "SELECT pID, cartella.ID,nome,cognome, data, tipo_visita, descrizione "
                    + "FROM  `cartella` JOIN anagrafe ON ( cartella.pid = anagrafe.id ) "
                    + "WHERE cartella.ID =" + idToVisit + " ";
            ResultSet set = JDBC.executeQuery(q, c);

            set.next();

            setIdVisita(set.getInt("ID"));
            setIdPaziente(set.getInt("pID"));
            setDataVisita(set.getTimestamp("data"));
            setTipoVisita(set.getString("tipo_visita"));
            setNomePaziente(set.getString("nome"));
            setCognomePaziente(set.getString("cognome"));
            setDescrizione(set.getString("descrizione"));

            set.close();
            c.close();

            setRender(false);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public void effettuaVisita() {
        Connection c = null;
        boolean error = true;
        try {
            renderUnsuccess = false;
            renderSuccess = false;
            if (!tipoVisita.equalsIgnoreCase("Vaccinazione")) {
                error = checkError();
            } else {
                error = false;
            }
            if (!error) {
                String visitaFatta = "UPDATE cartella "
                        + "SET  descrizione =  '" + getDescrizione() + "', is_fatta = 'T', data=CURRENT_TIMESTAMP "
                        + "WHERE  ID =" + getIdToVisit() + ";";
                c = JDBC.connect();
                JDBC.executeStatement(visitaFatta, c);
                if (!tipoVisita.equals("Vaccinazione")) {
                    Timestamp t = new Timestamp(getData().getTime());
                    String visitaProgrammata = "INSERT INTO `ppw_progetto2`.`cartella` (`pID`, `mID`, `data`, `tipo_visita`, `descrizione`, `is_fatta`) "
                            + "VALUES ('" + idPaziente + "', '" + getIdMedico() + "', '" + t.toString() + "', 'programmata', '', 'F');";
                    JDBC.executeStatement(visitaProgrammata, c);
                }
                String q = "SELECT email,capo_villaggio FROM paziente WHERE id ='" + idPaziente + "'";
                ResultSet set = JDBC.executeQuery(q, c);
                String mail = "";
                int capoVillaggio = -1;
                if (set.next()) {
                    mail = set.getString("email");
                    capoVillaggio = set.getInt("capo_villaggio");
                }
                q = "SELECT nome,cognome FROM anagrafe WHERE id ='" + idPaziente + "'";
                set = JDBC.executeQuery(q, c);
                String nomePaziente = null;
                if (set.next()) {
                    nomePaziente = set.getString("nome") + " " + set.getString("cognome");
                }
                DateTime d = DateTime.now(TimeZone.getDefault());
                if (mail == null) {
                    mail = "";
                }
                if (!mail.equals("") && nomePaziente != null) {
                    Utility.sendEmail(mail, Utility.toPDF(String.valueOf(getIdMedico()), d.format("DD/MM/YYYY"), getDescrizione(), nomePaziente));
                } else {
                    q = "SELECT email FROM paziente WHERE id ='" + capoVillaggio + "'";
                    set = JDBC.executeQuery(q, c);
                    if (set.next()) {
                        mail = set.getString("email");
                    }
                    Utility.sendEmail(mail, Utility.toPDF(String.valueOf(getIdMedico()), d.format("DD/MM/YYYY"), getDescrizione(), nomePaziente));
                }
            }
        } catch (Exception ex) {
        } finally {
            try {
                c.close();
            } catch (Exception ex) {
            }
        }
        if (error) {
            renderUnsuccess = true;
        } else {
            //cleanBean();
            renderSuccess = true;
        }
    }

    public boolean checkError() {
        boolean error = false;

        if (getTipologia().isEmpty()) {
            setRenderTipologiaError(true);
            error = true;
        } else {
            setRenderTipologiaError(false);
        }

        if (getDescrizione().isEmpty()) {
            setRenderDescrizioneError_corta(true);
            error = true;
        } else {
            setRenderDescrizioneError_corta(false);
        }

        if (getDescrizione().length() > 160) {
            setRenderDescrizioneError_lunga(true);
            error = true;
        } else {
            setRenderDescrizioneError_lunga(false);
        }

        if (getData() == null) {
            setRenderCalendarError(true);
            error = true;
        } else {
            if (getData().before(new Date())) {
                setRenderCalendarError(true);
                error = true;
            } else {
                setRenderCalendarError(false);
            }
        }
        return error;
    }

    private void cleanBean() {
        descrizione = "";
        tipologia = "";
        idMedico = -1;
        richiamo = null;
        ritardoRichiamo = null;
        data = null;
        renderPazienteError = false;
        renderTipologiaError = false;
        renderDescrizioneError_lunga = false;
        renderDescrizioneError_corta = false;
        renderCalendarError = false;
        renderUnsuccess = false;
    }

    /**
     * @return the idVista
     */
    public int getIdVisita() {
        return idVisita;
    }

    /**
     * @param idVista the idVista to set
     */
    public void setIdVisita(int idVisita) {
        this.idVisita = idVisita;
    }

    /**
     * @return the idmedico
     */
    public int getIdMedico() {
        return idMedico;
    }

    /**
     * @param idmedico the idmedico to set
     */
    public void setIdMedico(int idmedico) {
        this.idMedico = idmedico;
    }

    /**
     * @return the idPaziente
     */
    public int getIdPaziente() {
        return idPaziente;
    }

    /**
     * @param idPaziente the idPaziente to set
     */
    public void setIdPaziente(int idPaziente) {
        this.idPaziente = idPaziente;
    }

    /**
     * @return the nomePaziente
     */
    public String getNomePaziente() {
        return nomePaziente;
    }

    /**
     * @param nomePaziente the nomePaziente to set
     */
    public void setNomePaziente(String nomePaziente) {
        this.nomePaziente = nomePaziente;
    }

    /**
     * @return the cognomePaziente
     */
    public String getCognomePaziente() {
        return cognomePaziente;
    }

    /**
     * @param cognomePaziente the cognomePaziente to set
     */
    public void setCognomePaziente(String cognomePaziente) {
        this.cognomePaziente = cognomePaziente;
    }

    /**
     * @return the tipoVisita
     */
    public String getTipoVisita() {
        return tipoVisita;
    }

    /**
     * @param tipoVisita the tipoVisita to set
     */
    public void setTipoVisita(String tipoVisita) {
        if (tipoVisita.equals("programmata")) {
            this.tipoVisita = "Visita programmata";
        }
        if (tipoVisita.equals("spontanea")) {
            this.tipoVisita = "Visita spontanea";
        }
        if (tipoVisita.equals("vaccino")) {
            this.tipoVisita = "Vaccinazione";
        }
    }

    /**
     * @return the dataVisita
     */
    public Date getDataVisita() {
        return dataVisita;
    }

    /**
     * @param dataVisita the dataVisita to set
     */
    public void setDataVisita(Date dataVisita) {
        this.dataVisita = dataVisita;
    }

    /**
     * @return the render
     */
    public boolean isRender() {
        return render;
    }

    /**
     * @param render the render to set
     */
    public void setRender(boolean render) {
        this.render = render;
    }

    /**
     * @return the vB
     */
    public VisiteBean getvB() {
        return vB;
    }

    /**
     * @param vB the vB to set
     */
    public void setvB(VisiteBean vB) {
        this.vB = vB;
    }

    /**
     * @return the idToVisit
     */
    public int getIdToVisit() {
        return idToVisit;
    }

    /**
     * @param idToVisit the idToVisit to set
     */
    public void setIdToVisit(int idToVisit) {
        this.idToVisit = idToVisit;
    }

    /**
     * @return the renderPazienteError
     */
    public boolean isRenderPazienteError() {
        return renderPazienteError;
    }

    /**
     * @param renderPazienteError the renderPazienteError to set
     */
    public void setRenderPazienteError(boolean renderPazienteError) {
        this.renderPazienteError = renderPazienteError;
    }

    /**
     * @return the renderTipologiaError
     */
    public boolean isRenderTipologiaError() {
        return renderTipologiaError;
    }

    /**
     * @param renderTipologiaError the renderTipologiaError to set
     */
    public void setRenderTipologiaError(boolean renderTipologiaError) {
        this.renderTipologiaError = renderTipologiaError;
    }

    /**
     * @return the renderDescrizioneError_lunga
     */
    public boolean isRenderDescrizioneError_lunga() {
        return renderDescrizioneError_lunga;
    }

    /**
     * @param renderDescrizioneError_lunga the renderDescrizioneError_lunga to set
     */
    public void setRenderDescrizioneError_lunga(boolean renderDescrizioneError_lunga) {
        this.renderDescrizioneError_lunga = renderDescrizioneError_lunga;
    }

    /**
     * @return the renderDescrizioneError_corta
     */
    public boolean isRenderDescrizioneError_corta() {
        return renderDescrizioneError_corta;
    }

    /**
     * @param renderDescrizioneError_corta the renderDescrizioneError_corta to set
     */
    public void setRenderDescrizioneError_corta(boolean renderDescrizioneError_corta) {
        this.renderDescrizioneError_corta = renderDescrizioneError_corta;
    }

    /**
     * @return the renderCalendarError
     */
    public boolean isRenderCalendarError() {
        return renderCalendarError;
    }

    /**
     * @param renderCalendarError the renderCalendarError to set
     */
    public void setRenderCalendarError(boolean renderCalendarError) {
        this.renderCalendarError = renderCalendarError;
    }

    /**
     * @return the renderSuccess
     */
    public boolean isRenderSuccess() {
        return renderSuccess;
    }

    /**
     * @param renderSuccess the renderSuccess to set
     */
    public void setRenderSuccess(boolean renderSuccess) {
        this.renderSuccess = renderSuccess;
    }

    /**
     * @return the renderUnsuccess
     */
    public boolean isRenderUnsuccess() {
        return renderUnsuccess;
    }

    /**
     * @param renderUnsuccess the renderUnsuccess to set
     */
    public void setRenderUnsuccess(boolean renderUnsuccess) {
        this.renderUnsuccess = renderUnsuccess;
    }

    /**
     * @return the descrizione
     */
    public String getDescrizione() {
        return descrizione;
    }

    /**
     * @param descrizione the descrizione to set
     */
    public void setDescrizione(String descrizione) {
        this.descrizione = descrizione;
    }

    /**
     * @return the tipologia
     */
    public String getTipologia() {
        return tipologia;
    }

    /**
     * @param tipologia the tipologia to set
     */
    public void setTipologia(String tipologia) {
        this.tipologia = tipologia;
    }

    /**
     * @return the data
     */
    public Date getData() {
        return data;
    }

    /**
     * @param data the data to set
     */
    public void setData() {
        if (!getTipologia().equals("")) {
            int i = getRichiamo().indexOf(getTipologia());
            try {
                int delay = ritardoRichiamo.get(i);
                Timestamp t = new Timestamp(System.currentTimeMillis() + (delay * 1000));
                setData(new Date(t.getTime()));
            } catch (IndexOutOfBoundsException ex) {
                Timestamp t = new Timestamp(System.currentTimeMillis());
                setData(new Date(t.getTime()));
            }
        }
    }

    public ArrayList<String> getRichiamo() {

        richiamo = new ArrayList<String>();
        ritardoRichiamo = new ArrayList<Integer>();

        Connection c = null;
        ResultSet set = null;
        try {
            c = JDBC.connect();
            String q = "SELECT * "
                    + "FROM scaletta "
                    + "WHERE tipo='programmata' OR tipo ='periodica' ORDER BY descrizione ASC";
            set = JDBC.executeQuery(q, c);
            while (set.next()) {
                richiamo.add(set.getString("descrizione"));
                ritardoRichiamo.add(set.getInt("valore"));
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            try {
                c.close();
                set.close();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        }

        return richiamo;
    }

    /**
     * @param data the data to set
     */
    public void setData(Date data) {
        this.data = data;
    }

    /**
     * @return the richiami
     */
    public int getRichiami() {
        return richiami;
    }

    /**
     * @param richiami the richiami to set
     */
    public void setRichiami(int richiami) {
        this.richiami = richiami;
    }

    public String getIconPath() {
        if (richiami > 1) {
            return "/images/todo_urgent.png";
        } else {
            return "/images/verified.png";
        }
    }
}
